這邊要講的ViewController(即VC)的部分
在VC這邊會需要先進行binding,才能讓ViewModel更新完後的變更在VC進行
let viewModel: ExampleViewModel
init(viewModel: ExampleViewModel) {
self.viewModel = viewModel
super.init(nibName: String(describing: ExampleViewController.self), bundle: nil)
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func viewDidload() {
super.viewDidLoad()
// 一定要記得Binding,否則viewModel會改變不過來
bindViewMoodel()
// 只要不是畫面更新都會在ViewModel
// download完後,ViewModel因為在VC有binding,所以下載完資料後,透過binding,可以直接通知到VC進行更新
viewModel.intputs.downloadData()
}
private func bindViewModel() {
var outputs = viewModel.outputs
outputs.reloadData = {
// VC更新UI,實際執行的部分
// 舉例: tableView.reloadData() 這樣
}
}
class ExampleViewController {
let viewModel: ExampleViewModel?
init(viewModel: ExampleViewModel) {
self.viewModel = viewModel
super.init(nibName: String(describing: ExampleViewController.self), bundle: nil)
}
override func viewDidload() {
super.viewDidLoad()
// 一定要記得Binding,否則viewModel會改變不過來
bindViewMoodel()
// 實際使用: 只要不是畫面更新都會在ViewModel
// download完後,ViewModel因為在VC有binding,所以下載完資料後,透過binding,可以直接通知到VC進行更新
viewModel.intputs.downloadData()
}
private func bindViewModel() {
var outputs = viewModel.outputs
// download完後,更新的部分
outputs.reloadData = {
// 實際執行的部分,UI更新
// 舉例: tableView.reloadData() 這樣
}
}
}
以上如果一步一步來的話,就可以完成MVVM架構
我踩的坑通常都是在趕進度的時候,有時候會不小心忘記沒有在ViewDidLoad的時候進行binding的function,然後發現沒變更一直查Bug,查到的時候通常都會臉色一黑,覺得自己怎麼這麼會搞自己。